package com.coastline.fruit.common.utils;

/**
 * hash工具类
 *
 * @author Coastline
 * @date 2025/1/13 22:03
 */
public final class ConsistentHashUtil {
    /**
     * 使用FNV算法计算hash值
     *
     * @param str 字符串
     * @return hash hash值
     */
    private static int getHash(String str) {
        final int pe = 16777619;
        int hash = (int) 2166136261L;
        for (int i = 0; i < str.length(); i++) {
            hash = (hash ^ str.charAt(i)) * pe;
        }
        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;
        if (hash < 0) {
            hash = Math.abs(hash);
        }
        return hash;
    }

    /**
     * 分表时使用
     * 根据id计算表后缀
     *
     * @param id id 分表根据id
     * @param number 表数量 后缀
     * @return 表后缀
     */
    public static String getHashForNumber(String id, int number) {
        int hash = getHash(id);
        return String.valueOf(hash % number + 1);
    }
}
